package com.sheng.leetcode.year2022.swordfingeroffer.day16;

import org.junit.Test;

import java.util.*;

/**
 * @author liusheng
 * @date 2022/09/14
 *<p>
 * 剑指 Offer 61. 扑克牌中的顺子<p>
 *<p>
 * 从若干副扑克牌中随机抽 5 张牌，判断是不是一个顺子，<p>
 * 即这5张牌是不是连续的。2～10为数字本身，A为1，J为11，Q为12，K为13，而大、小王为 0 ，<p>
 * 可以看成任意数字。A 不能视为 14。<p>
 *<p>
 * 示例1:<p>
 * 输入: [1,2,3,4,5]<p>
 * 输出: True<p>
 *<p>
 * 示例2:<p>
 * 输入: [0,0,1,2,5]<p>
 * 输出: True<p>
 *<p>
 * 限制：<p>
 *<p>
 * 数组长度为 5<p>
 *<p>
 * 数组的数取值为 [0, 13] .<p>
 *<p>
 * 来源：力扣（LeetCode）<p>
 * 链接：<a href="https://leetcode.cn/problems/bu-ke-pai-zhong-de-shun-zi-lcof">...</a><p>
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。<p>
 */
public class Sword0061 {

    @Test
    public void test01() {
//        int[] nums = {1,2,3,4,5};
//        int[] nums = {0,0,1,2,5};
//        int[] nums = {4,7,5,9,2};
        int[] nums = {11,0,9,0,0};
        System.out.println(new Solution61().isStraight(nums));
    }
}
//class Solution61 {
//    public boolean isStraight(int[] nums) {
//        int zero = 0;
//        int sum = 0;
//        Arrays.sort(nums);
//        // 判断其中是否有0
//        for (int i = 0; i < nums.length; i++) {
//            // 计算0的数量
//            if (nums[i] == 0) {
//                zero++;
//                continue;
//            }
//            if (i != nums.length - 1) {
//                // 有重复牌直接返回
//                if (nums[i + 1] - nums[i] == 0) {
//                    return false;
//                }
//                // 排除两张牌之间相差为1，即连续的情况
//                if (nums[i + 1] - nums[i] != 1) {
//                    // 将不连续的情况中的差值加起来
//                    sum += nums[i + 1] - nums[i] - 1;
//                }
//            }
//        }
//        return zero >= sum;
//    }
//}

// 运行速度差不多，思路很好，直接计算没有重复，没有0在内的最大最小牌之间差值量
class Solution61 {
    public boolean isStraight(int[] nums) {
        Set<Integer> repeat = new HashSet<>();
        int max = 0, min = 14;
        for(int num : nums) {
            // 跳过大小王
            if(num == 0) {
                continue;
            }
            // 最大牌
            max = Math.max(max, num);
            // 最小牌
            min = Math.min(min, num);
            // 若有重复，提前返回 false
            if(repeat.contains(num)) {
                return false;
            }
            // 添加此牌至 Set
            repeat.add(num);
        }
        // 最大牌 - 最小牌 < 5 则可构成顺子
        return max - min < 5;
    }
}
//
//作者：jyd
//链接：https://leetcode.cn/problems/bu-ke-pai-zhong-de-shun-zi-lcof/solution/mian-shi-ti-61-bu-ke-pai-zhong-de-shun-zi-ji-he-se/
//来源：力扣（LeetCode）
//著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
